package com.wei.czz.framework.store.controller;

import java.util.List;
import java.util.Objects;

import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.store.*;
import com.wei.czz.common.enums.CommonEnum;
import com.wei.czz.common.jsr303.group.Save;
import com.wei.czz.common.jsr303.group.Search;
import com.wei.czz.common.jsr303.group.Submit;
import com.wei.czz.common.jsr303.group.Update;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.store.StoreAccountVo;
import com.wei.czz.common.vo.store.StoreFormVo;
import com.wei.czz.common.vo.store.StoreSaveVo;
import com.wei.czz.framework.store.manager.StoreManager;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 商店表
 *
 * @author wei
 * email 945158190@gmail.com
 * date 2023-11-22 17:44:15
 */
@RestController
@RequestMapping("/store")
@AllArgsConstructor
public class StoreController {

    private static final Logger log = LoggerFactory.getLogger(StoreController.class);

    private final StoreManager storeManager;

    /**
     * 保存商店接口
     * <p>
     * 此接口会校验是否重复提交
     * @param storeSaveVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "保存商店")
    @PostMapping("/save")
    public Result<StoreSaveDto> saveStore(@Validated(Save.class) @RequestBody StoreSaveVo storeSaveVo) {
        log.info("开始保存商店业务。{}", storeSaveVo);

        StoreSaveDto storeSaveDto = storeManager.saveNewStore(storeSaveVo);

        log.info("保存商店业务结束");
        return Result.success(storeSaveDto);
    }

    /**
     * 提交商店接口
     * <p>
     * 此接口会校验是否重复提交
     * @param storeSaveVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "提交商店")
    @PostMapping("/submit")
    public Result<Object> submitStore(@Validated(Submit.class) @RequestBody StoreSaveVo storeSaveVo) {
        log.info("开始提交商店业务。{}", storeSaveVo);

        Result<Object> result = this.checkStoreAccount(storeSaveVo.getStoreAccountVo());
        if (Objects.nonNull(result)) {
            return result;
        }

        storeManager.submitStore(storeSaveVo);

        log.info("提交商店业务结束");
        return Result.success();
    }

    /**
     * 快速提交商店接口
     * <p>
     * 此接口会校验是否重复提交
     * @param id 主键
     * @return 结果
     */
    @Resubmit(message = "提交商店")
    @PostMapping("/fast/submit")
    public Result<String> fastSubmitStore(@RequestParam("id") Long id) {
        log.info("开始快速提交商店业务。id={}", id);

        String message = storeManager.fastSubmitStore(id);

        log.info("快速提交商店业务结束");
        return Result.success(message);
    }

    /**
     * 获取商店首页枚举数据接口
     * @return 结果
     */
    @GetMapping("/enums")
    public Result<StoreIndexEnumDto> getStoreIndexEnums() {
        log.info("开始获取商店首页枚举数据业务");

        StoreIndexEnumDto storeIndexEnumDto = storeManager.getStoreIndexEnums();

        log.info("获取商店首页枚举数据业务结束");
        return Result.success(storeIndexEnumDto);
    }

    /**
     * 获取商店枚举数据接口
     * @return 结果
     */
    @GetMapping("/add/enums")
    public Result<StoreAddEnumDto> getStoreAddEnums() {
        log.info("开始获取商店枚举数据业务");

        StoreAddEnumDto storeAddEnumDto = storeManager.getStoreAddEnums();

        log.info("获取商店枚举数据业务结束");
        return Result.success(storeAddEnumDto);
    }

    /**
     * 获取商店枚举数据接口
     * @return 结果
     */
    @GetMapping("/modify/enums")
    public Result<StoreModifyEnumDto> getStoreModifyEnums(@RequestParam("id") Long id) {
        log.info("开始获取商店枚举数据业务。id={}", id);

        StoreModifyEnumDto storeModifyEnumDto = storeManager.getStoreModifyEnums(id);

        log.info("获取商店枚举数据业务结束");
        return Result.success(storeModifyEnumDto);
    }

    /**
     * 分页查询用户商店接口
     * @param storeFormVo 参数对象
     * @return 结果
     */
    @PostMapping("/page/list")
    public Result<PageDto<StoreListDto>> getStorePageList(@Validated(Search.class) @RequestBody StoreFormVo storeFormVo) {
        log.info("开始分页查询用户商店业务。{}", storeFormVo);

        PageDto<StoreListDto> pageDto = storeManager.getStorePageList(storeFormVo);

        log.info("分页查询用户商店业务结束");
        return Result.success(pageDto);
    }

    /**
     * 获取商店详情接口
     * @param id      商店主键
     * @param isFirst 第一次请求标记[true-是 false-否]
     * @return 结果
     */
    @GetMapping("/detail")
    public Result<StoreDetailDto> getStoreDetail(@RequestParam("id") Long id,
                                                 @RequestParam(value = "isFirst", required = false) Boolean isFirst) {
        log.info("开始获取商店详情业务。id={} isOld={}", id, isFirst);

        StoreDetailDto storeDetailDto = storeManager.getStoreDetail(id, isFirst);

        log.info("获取商店详情业务结束");
        return Result.success(storeDetailDto);
    }


    /**
     * 获取正在编辑的商店接口
     * @param id 主键
     * @return 结果
     */
    @GetMapping("/edit/detail")
    public Result<StoreModifyDetailDto> getEditStoreDetail(@RequestParam("id") Long id) {
        log.info("开始获取正在编辑的商店业务。id={}", id);

        StoreModifyDetailDto storeModifyDetailDto = storeManager.getEditStoreDetail(id);

        log.info("获取正在编辑的商店业务结束");
        return Result.success(storeModifyDetailDto);
    }

    /**
     * 商店撤销审核接口
     * <p>
     * 此接口会校验是否重复提交
     * @param id 主键
     * @return 结果
     */
    @Resubmit(message = "撤销审核")
    @PostMapping("/withdraw/audit")
    public Result<Object> withdrawAudit(@RequestParam("id") Long id) {
        log.info("开始商店撤销审核业务。id={}", id);

        storeManager.withdrawAudit(id);

        log.info("商店撤销审核业务结束");
        return Result.success();
    }

    /**
     * 商店修改提交接口
     * @param storeSaveVo 参数对象
     * @return 结果
     */
    @PostMapping("/modify")
    public Result<Object> modifyStore(@Validated(Update.class) @RequestBody StoreSaveVo storeSaveVo) {
        log.info("开始商店修改提交业务。{}", storeSaveVo);

        Result<Object> result = this.checkStoreAccount(storeSaveVo.getStoreAccountVo());
        if (Objects.nonNull(result)) {
            return result;
        }

        storeManager.modifyStore(storeSaveVo);

        log.info("商店修改提交业务结束");
        return Result.success();
    }

    /**
     * 删除商店接口
     * <p>
     * 此接口会校验是否重复提交
     * @param idList 主键列表
     * @return 结果
     */
    @Resubmit(message = "删除商店")
    @DeleteMapping("/delete")
    public Result<Object> delete(@RequestBody List<Long> idList){
        log.info("开始删除商店业务。idList={}", idList);

        storeManager.deleteStore(idList);

        log.info("删除商店业务结束");
        return Result.success();
    }

    /**
     * 校验商店账户
     * @param storeAccountVo 商店账户参数对象
     * @return 校验结果
     */
    private Result<Object> checkStoreAccount(StoreAccountVo storeAccountVo) {
        if (CommonEnum.ZERO.getValue().equals(storeAccountVo.getType())) {
            // 对公
            if (StringUtils.isBlank(storeAccountVo.getEnterpriseName())) {
                log.info("账户企业名称不能为空");
                return Result.fail("账户企业名称不能为空");
            }
            if (StringUtils.isBlank(storeAccountVo.getEnterpriseNo())) {
                log.info("账户企业社会统一信用代码不能为空");
                return Result.fail("账户企业社会统一信用代码不能为空");
            }
        } else {
            // 对私
            if (StringUtils.isBlank(storeAccountVo.getName())) {
                log.info("账户名称不能为空");
                return Result.fail("账户名称不能为空");
            }
            if (StringUtils.isBlank(storeAccountVo.getIdCard())) {
                log.info("账户身份证号不能为空");
                return Result.fail("账户身份证号不能为空");
            }
        }
        return null;
    }
}
